package leetcode.code2349;

import java.awt.RenderingHints.Key;
import java.util.HashMap;
import java.util.Map;
import java.util.TreeSet;

public class NumberContainers {

	Map<Integer, Integer> indexs;
	Map<Integer, TreeSet<Integer>> nums;

	public NumberContainers() {
		indexs = new HashMap<>();
		nums = new HashMap<>();
	}

	public void change(int index, int number) {
		if (indexs.containsKey(index)) {
			nums.get(indexs.get(index)).remove(index);
		}
		indexs.put(index, number);
//		if (nums.computeIfPresent(number, (key, value) -> {
//			value.add(index);
//			return value;
//		}) == null) {
//			nums.computeIfAbsent(number, key -> {
//				TreeSet<Integer> ts = new TreeSet<>();
//				ts.add(index);
//				return ts;
//			});
//		}
		nums.computeIfAbsent(number, key -> new TreeSet<>()).add(number);
	}

	public int find(int number) {
		return nums.containsKey(number) && nums.get(number).size() != 0 ? nums.get(number).first() : -1;
	}

	public static void main(String[] args) {
		NumberContainers nc = new NumberContainers();
		nc.change(1, 10);
		nc.find(10); // 没有数字 10 ，所以返回 -1 。
		nc.change(1, 20);
		nc.find(10); // 没有数字 10 ，所以返回 -1 。
		nc.find(20); // 没有数字 10 ，所以返回 -1 。
		nc.find(30); // 没有数字 10 ，所以返回 -1 。
//		nc.change(2, 10); // 容器中下标为 2 处填入数字 10 。
//		nc.change(1, 10); // 容器中下标为 1 处填入数字 10 。
//		nc.change(3, 10); // 容器中下标为 3 处填入数字 10 。
//		nc.change(5, 10); // 容器中下标为 5 处填入数字 10 。
//		nc.find(10); // 数字 10 所在的下标为 1 ，2 ，3 和 5 。因为最小下标为 1 ，所以返回 1 。
//		nc.change(1, 20); // 容器中下标为 1 处填入数字 20 。注意，下标 1 处之前为 10 ，现在被替换为 20 。
//		nc.find(10); // 数字 10 所在下标为 2 ，3 和 5 。最小下标为 2 ，所以返回 2

	}

}
